package Others.DesignPattern.DecoratorPattern.Pattern;

import Others.DesignPattern.DecoratorPattern.Pattern.Decorator.*;

public class main {
    public static void main(String[] args) {
        //装饰器模式

        people xc = new people("小菜");

        //这种构造传入的话--顺序会受限制--受你创建的对象顺序决定
        //不好，还是改为构造传入，最为合适
//        BigTrouser bigTrouser = new BigTrouser();
//        Sneakers sneakers = new Sneakers(bigTrouser);
//        TShirts tShirts = new TShirts(sneakers);

        BigTrouser bigTrouser = new BigTrouser();
        Sneakers sneakers = new Sneakers();
        TShirts tShirts = new TShirts();

        //完整的写法
        System.out.println("第一种装扮");
        sneakers.Decorator(xc);         //这里属于装饰过程
        bigTrouser.Decorator(sneakers);
        tShirts.Decorator(bigTrouser);
        tShirts.show();

        System.out.println();

        //简化写法--他必须使用构造传入，才能做到简化，但是构造传入又限制了顺序
        System.out.println("第二种装扮");
        LeatherShoes leatherShoes = new LeatherShoes();
        Tie tie = new Tie();
        Suit suit = new Suit();

        leatherShoes.Decorator(xc);
        tie.Decorator(leatherShoes);
        suit.Decorator(tie);
        suit.show();


    }
    //先说好处--后续如果需要扩展服饰的内容，只需要额外增加具体的服饰类即可，让其继承dress这一个装饰类
    //真正的做到了开闭原则--对于顺序来说，本身就是动态可变的


    //    在装饰模式（Decorator Pattern）中，装饰类本身不能直接作为 “接口”，但它必须实现与被装饰类相同的接口（或抽象类），这样才能保证装饰后的对象能被客户端以统一的方式使用（即 “里氏替换原则”）。
//    核心逻辑：
//    装饰模式的核心是 “增强功能但不改变接口”，其结构包含四个角色：
//
//    抽象组件（Component）：定义接口，规定被装饰类和装饰类都必须实现的方法。
//    具体组件（ConcreteComponent）：被装饰的原始类，实现 Component 接口。
//    抽象装饰器（Decorator）：实现 Component 接口，并持有一个 Component 类型的引用（用于指向被装饰的对象）。
//    具体装饰器（ConcreteDecorator）：继承 Decorator，通过重写方法增强被装饰对象的功能。

}
